package schedule;

import java.util.ArrayList;

import plan.Belegung;
import plan.Plan;
import util.Interval;
import auftrag.Auftrag;
import auftrag.Operation;
import auftrag.Produkt;
import auftrag.Ressource;
import auftrag.Variante;

public class SimplePlan implements ISchedule {
	private int mMethod = 0;
	
	public Plan makePlan(ArrayList<?> pAuftragList,
			ArrayList<Ressource> pRessourceList, int pMethod) {
		mMethod = pMethod;
		return makePlan(pAuftragList, pRessourceList);
	}

	@Override
	public Plan makePlan(ArrayList<?> pAuftragList,
			ArrayList<Ressource> pRessourceList) {
		Plan p = new Plan();
		if(Auftrag.class.isInstance(pAuftragList.get(0))){
			for(int intIndexA = 0; intIndexA < pAuftragList.size(); intIndexA++) {
				Auftrag aufAuftragA = (Auftrag) pAuftragList.get(intIndexA);
				for(int intIndexB = 0; intIndexB < aufAuftragA.getAuftragProdukteSize(); intIndexB++){
					Produkt proProduktA = (Produkt) aufAuftragA.getAuftragProdukte().get(intIndexB);
					//if(proProduktA.getChosenVariante() == null)
						proProduktA.chooseVariant(0, mMethod);
					Variante varVarianteA = proProduktA.getChosenVariante();
					for(int intIndexD = 1; intIndexD <= varVarianteA.getOperationSize(); intIndexD++) {
						Operation opeOperationA = varVarianteA.getOperation(intIndexD);
						Interval intIntervalA;
						if(opeOperationA.getPreviousOperation() == null)
							intIntervalA = opeOperationA.getRessource().getFirstUnoccupiedInterval(opeOperationA.getParent().getParent().getParent().getEarliestStartTime(), opeOperationA.getDuration());
						else {
							intIntervalA = opeOperationA.getRessource().getFirstUnoccupiedInterval(opeOperationA.getPreviousOperation().getInterval().getEnd(), opeOperationA.getDuration());
						}
						Belegung belBelegungA = new Belegung(opeOperationA, intIntervalA);
						p.addBelegung(belBelegungA);
					}
				}
			}
		} else if(Produkt.class.isInstance(pAuftragList.get(0))){
			for(int intIndexB = 0; intIndexB < pAuftragList.size(); intIndexB++){
				Produkt proProduktA = (Produkt) pAuftragList.get(intIndexB);
				//if(proProduktA.getChosenVariante() == null)
					proProduktA.chooseVariant(0, mMethod);
				Variante varVarianteA = proProduktA.getChosenVariante();
				for(int intIndexD = 1; intIndexD <= varVarianteA.getOperationSize(); intIndexD++) {
					Operation opeOperationA = varVarianteA.getOperation(intIndexD);
					Interval intIntervalA;
					if(opeOperationA.getPreviousOperation() == null)
						intIntervalA = opeOperationA.getRessource().getFirstUnoccupiedInterval(opeOperationA.getParent().getParent().getParent().getEarliestStartTime(), opeOperationA.getDuration());
					else {
						intIntervalA = opeOperationA.getRessource().getFirstUnoccupiedInterval(opeOperationA.getPreviousOperation().getInterval().getEnd(), opeOperationA.getDuration());
					}
					Belegung belBelegungA = new Belegung(opeOperationA, intIntervalA);
					p.addBelegung(belBelegungA);
				}
			}
			
		}
		return p;
	}

}
